package com.atguigu.teach.mytask;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

class MyCache{
    Map<String,String> map=new HashMap<String,String>();
    Lock lock=new ReentrantLock();
    final ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();

    public void write(String key,String value){
       // lock.lock();
        reentrantReadWriteLock.writeLock().lock();
        try{
            System.out.println(Thread.currentThread().getName()+"\t"+"----开始写");
            map.put(key, value);
            System.out.println(Thread.currentThread().getName()+"\t"+"----结束写");
        }catch (Exception e){

        }finally {
            reentrantReadWriteLock.writeLock().unlock();
         //   lock.unlock();
        }

    }

    public void read(String key){
        reentrantReadWriteLock.readLock().lock();
        try{
            System.out.println(Thread.currentThread().getName()+"\t"+"----开始读");
            String result =map.get(key);
            System.out.println(Thread.currentThread().getName()+"\t"+"----结束读"+result);
        }catch (Exception e){

        }finally {
            reentrantReadWriteLock.readLock().unlock();
        }

    }
}
/**
 * @name:
 * @params:
 * @description:读写锁：
 * 对于同一个资源，我们涉及多线程的操作，有读，有写，交替进行。为了保证读写一致性。
 * 读  读 可共享
 * 读  写 不共享
 * 写  写 不共享
 * 读的时候希望高并发同时进行，可以共享，可以多个线程同时操作进行中。。。。。。。
 *  写的时候为了保证数据一致性，需要独占排它
 *
 * 题目：10个线程读 10个线程写入，操作同一个资源类
 * @return:
 * @exception/throws:
 * @author: zxb
 * @date:   2021/10/25
 */
public class MyReadWriteLockDemo {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();


        for (int i = 1; i <=10 ; i++) {
            int finalI=i;
            new Thread(()->{
                myCache.write(finalI+"",finalI+"");
        },String.valueOf(i)).start();
        }
        for (int i = 1; i <=10 ; i++) {
            int finalI=i;
            new Thread(()->{
                myCache.read(finalI+"");
            },String.valueOf(i)).start();
        }
    }
}
